home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy001 / lowlevel / omandel.asm < prev    next >
Encoding:
Assembly Source File  |  1995-07-11  |  5.8 KB  |  158 lines

  1. .MODEL TINY
  2. .287
  3. .CODE
  4.  
  5.                                 ORG     100h
  6. Inicio:         JMP     Main
  7.  
  8. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  9. ;-=-=-=        AREA DE DATOS DEL PROGRAMA
  10. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  11.  
  12.  X1             DQ      -0.25E1         ;  Variables que definen la ventana
  13.  X2             DQ      0.15E1          ; de visión fractal.
  14.  Y1             DQ      0.15E1
  15.  Y2             DQ      -0.15E1
  16.  
  17.  VariacionX     DQ      320E0           ;  Representan la variación de coordenadas
  18.  VariacionY     DQ      200E0           ; en el plano fractal por cada pixel.
  19.  
  20.  Estado         DW      ?               ;  Estado del copro.
  21.  aux            DQ      ?               ;  Para llevar una variable temporal.
  22.  aux2           DD      2E0             ;  Utilizada para multiplicación.
  23.  aux3           DD      4E0             ;  Utilizada para comparación.
  24.  
  25. ;-=-=-=  Variables de la ecuación imaginaria: Z=Z²+C
  26.  a              DQ      ?
  27.  b              DQ      ?
  28.  x              DQ      ?
  29.  y              DQ      ?
  30.  
  31. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  32. ;-=-=-=        AREA DE CαDIGO DEL PROGRAMA 
  33. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  34.  
  35. Main            PROC                    ;  Función principal.
  36.                 FLD     X2
  37.                 FSUB    X1
  38.                 FDIV    VariacionX      ;  En st(0) tenemos (X2-X1)/320.
  39.                 FSTP    VariacionX      ;  Lo guardamos en memória.
  40.  
  41.                 FLD     Y2
  42.                 FSUB    Y1
  43.                 FDIV    VariacionY      ;  En st(0) tenemos (Y2-Y1)/320.
  44.                 FSTP    VariacionY      ;  Lo guardamos en memória.
  45.  
  46.                 FLD     X1              ;  a = X1 (no es el método más
  47.                 FSTP    a               ; rápido, pero...)
  48.  
  49.                 MOV     AX, 0013h
  50.                 INT     10h             ;  Establecemos modo video 13h.
  51.  
  52.                 MOV     AX, 0A000h
  53.                 MOV     ES, AX          ;  ES contendrá "siempre" el segmento
  54.                                         ; de video.
  55.                 MOV     DX, 320d        ;  Contador de la variable NPH
  56.                 XOR     CL, CL          ;  Para acelerar el proceso.
  57.  
  58.         @BucleK:                        ;  Bucle donde se establecen las coor. horizontales.
  59.                 OR      DX, DX
  60.                 JNZ    @@BK
  61.                 JMP    @Fin
  62.                
  63.               @@BK:
  64.                 FLD     a
  65.                 FADD    VariacionX
  66.                 FSTP    a               ;  Se incrementa "a" en VariacionX.
  67.  
  68.                 FLD     Y2
  69.                 FSTP    b               ;  b = Y2
  70.  
  71.                 MOV     CH, 200d        ;  Contador de la variable NPV
  72.         
  73.         @BucleJ:                        ;  Bucle donde se establecen las coor. verticales.
  74.                 OR      CH, CH
  75.                 JNZ    @@BJ
  76.                 JMP    @SiguienteLinea
  77.               
  78.               @@BJ:
  79.                 FLD     b
  80.                 FSUB    VariacionY
  81.                 FSTP    b               ;  Se decrementa "b" en VariacionY.
  82.  
  83.                 FLDZ
  84.                 FST     x
  85.                 FSTP    y
  86.                 XOR     BX, BX          ;  x = y = BX = 0 (BX son las iteraciones).
  87.  
  88.         @BucleIteraciones:              ;  Bucle principal.
  89.                 CMP     BX, 100         ;  100 es el número máx. de iteraciones.
  90.                 JNB    @SiguientePunto  ;  Si máximas iteraciones permitidas.
  91.                 
  92.                 FLD     y
  93.                 FMUL    y
  94.                 FLD     x
  95.                 FMUL    x
  96.                 FADD    st(0), st(1)
  97.                 FSUB    aux3            ;  Le resta 4
  98.                 FTST                    ;  Comprueba si «x^2+y^2» excede de 4.
  99.                 FSTSW   Estado
  100.                 MOV     AX, Estado      ;  Ponemos en los flags la palabra de
  101.                 SAHF                    ; estado del copro.
  102.                 FFREE   st(0)           ;  Vaciamos la pila del copro.
  103.                 FFREE   st(1)
  104.                 JZ     @SiguientePunto  ;  Si el módulo es mayor que 2
  105.                 
  106.                 FLD     y
  107.                 FMUL    y
  108.                 FLD     x
  109.                 FMUL    x
  110.                 FSUB    st(0), st(1)
  111.                 FADD    a               ;  Hemos hecho: «x^2-y^2+a»
  112.                 FSTP    aux             ;  Lo guardamos en la auxiliar.
  113.                 FFREE   st(0)           ;  Vaciamos la pila del copro.
  114.  
  115.                 FLD     x
  116.                 FMUL    y
  117.                 FMUL    aux2
  118.                 FADD    b
  119.                 FSTP    y               ;  Hacemos que "y" valga «2*x*y+b»
  120.  
  121.                 FLD     aux
  122.                 FSTP    x               ;  x = aux
  123.  
  124.                 INC     BX
  125.                 JMP    @BucleIteraciones
  126.  
  127.         @SiguientePunto:
  128.  
  129. ;-=-=-= ASIGNACION DE COLORES
  130.                 MOV     AX, BX
  131.                 MOV     BH, 100d
  132.                 DIV     BH              ;  En AH el color deseado.
  133.                 
  134.                 PUSH    DX
  135.                 PUSH    CX
  136.                 ADD     DX, CX
  137.                 SHR     CX, 1
  138.                 SHR     CX, 1
  139.                 ADD     CX, DX
  140.                 MOV     DI, CX
  141.                 MOV     BYTE PTR [ES:DI], AH     ;  Ponemos un punto en el sítio donde
  142.                 POP     CX              ; acabamos de calcular.
  143.                 POP     DX
  144.  
  145.                 DEC     CH
  146.                 JMP    @BucleJ
  147.         
  148.         @SiguienteLinea:
  149.                 DEC     DX
  150.                 JMP    @BucleK
  151.         
  152.         @Fin:
  153.                 MOV     AX, 4C00h
  154.                 INT     21h
  155.  
  156. Main            ENDP
  157.                 END     Inicio
  158.